﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
using DevExpress.XtraEditors;
using Library.UI.Grid;
using Library.UI.Form;
using QuanLyDiem.Controllers;
using QuanLyDiem.models;
namespace QuanLyDiem.QLDiem
{
    public partial class frmTaoLopHocPhan : DevExpress.XtraEditors.XtraForm
    {
        public frmTaoLopHocPhan()
        {
            InitializeComponent();
        }
        
        private void TaoLopHocPhan_Load(object sender, EventArgs e)
        {
            gridView1.Config(true, false, false, false, true, false, true, false, false);
            gridView1.Config2(DevExpress.XtraGrid.Views.Grid.GridMultiSelectMode.RowSelect, false, true);
            gridView2.Config(false, false, false, false, true, false, true, false, false);
            gridView2.Config2(DevExpress.XtraGrid.Views.Grid.GridMultiSelectMode.RowSelect, false, true);
            
            Context db = new Context();
            C_Mon.LoadDataSource(rleMonHoc, db);
            C_He.LoadDataSource(lueHe);
            C_Khoa.LoadDataSource(lueKhoa);
            //C_ChuyenNganh.LoadDataSource(lueChuyenNganh);
            C_KhoaHoc.LoadDataSource(lueKhoaHoc);
            txtNamKetThuc.SetMask("[2-9][0-9]{3}");
            txtNamBatDau.SetMask("[2-9][0-9]{3}");
            txtHocKy.SetMask("[1-2]");
            
        }
        private void gridView1_RowClick(object sender, DevExpress.XtraGrid.Views.Grid.RowClickEventArgs e)
        {
            if (txtNamBatDau.Text == "" || txtNamKetThuc.Text == "" || txtHocKy.Text == "")
            {
                MessageBox.Show("Dữ liệu năm học hoặc học kỳ chưa được nhập");
            }
            else
            {
                Context db = new Context();
                var row = gridView1.GetFocusedRow() as ChuongTrinhDaoTaoChiTiet;
                lueMonHoc.EditValue = row.ID_mon;

                int id_hes =int.Parse(lueHe.EditValue.ToString());
                int id_khoas=int.Parse(lueKhoa.EditValue.ToString());
                int id_chuyennganhs=int.Parse(lueChuyenNganh.EditValue.ToString());
                int khoa_hocs=int.Parse(lueKhoaHoc.Text);
                var lops = db.Lops.Where(p => p.ID_khoa == id_khoas && p.ID_he==id_hes && p.ID_chuyen_nganh==id_chuyennganhs && p.Khoa_hoc==khoa_hocs).ToList();
                var result = from p in lops
                             select new EXT_Lop
                             {
                                 Trang_thai = false,
                                 ID_khoa = p.ID_khoa,
                                 ID_he=p.ID_he,
                                 ID_chuyen_nganh=p.ID_chuyen_nganh,
                                 ID_lop = p.ID_lop,
                                 Ten_lop = p.Ten_lop,
                                 Khoa_hoc = p.Khoa_hoc,
                                 So_sv = p.So_sv,
                                 Nien_khoa = p.Nien_khoa,
                                 Ky_hoc = ConvertKyHoc(txtNamBatDau.Text, txtNamKetThuc.Text, txtHocKy.Text, p.Nien_khoa)
                             };
                var result1 = result.Where(p => p.Ky_hoc == row.Ky_thu).ToList();
                eXTLopBindingSource.DataSource = result1.ToList();
            }
        }

        public int ConvertKyHoc(string NamBatDau, string NamKetThuc, string Hoc_Ky, string Nien_khoa)
        {
            int a = int.Parse(NamBatDau);
            int b = int.Parse(NamKetThuc);
            int c = int.Parse(Hoc_Ky);
            int d = int.Parse(Nien_khoa.Substring(0, Nien_khoa.IndexOf("-")));
            int e = int.Parse(Nien_khoa.Substring(Nien_khoa.IndexOf("-")+1));
            int Ky_hoc = 0;
            if (a >= d && b <= e)
            {
                Ky_hoc = (a - d) * 2 + c;
            }
            else
                return -1;
            return Ky_hoc;
        }

        private void txtNamBatDau_Validating(object sender, CancelEventArgs e)
        {
            if (string.IsNullOrEmpty(txtNamBatDau.Text) || (txtNamBatDau.Text.Length != 4))
            {
                MessageBox.Show("Chưa nhập đúng dữ liệu năm học");
               txtNamBatDau.SetFocus();
            }
            else
            {
                txtNamKetThuc.Text = (int.Parse(txtNamBatDau.Text) + 1).ToString();

            }


        }

        private void txtNamKetThuc_Validating(object sender, CancelEventArgs e)
        {
            if (string.IsNullOrEmpty(txtNamKetThuc.Text) || (txtNamKetThuc.Text.Length != 4))
            {
                MessageBox.Show("Chưa nhập đúng dữ liệu năm học");
                txtNamKetThuc.SetFocus();
            }
            else
            {
                txtNamBatDau.Text = (int.Parse(txtNamKetThuc.Text) - 1).ToString();
            }
        }
            
        private void btnTaolophocphan_Click(object sender, EventArgs e)
        {
            if (gridView2.RowCount == 0)
            {
                MessageBox.Show("Không có dữ liệu lớp");
            }
            else
            {
                Context db = new Context();
                try
                {
                    for (int i = 0; i < gridView2.RowCount; i++)
                    {
                        var row = gridView2.GetRow(i) as EXT_Lop;
                        if (row.Trang_thai)
                        {
                            var dsl = db.DanhSachLops.Where(p => p.ID_lop == row.ID_lop).ToList();
                            var kt = db.LopHocPhans.Where(p => p.ID_lop == row.ID_lop && p.ID_mon == (int)lueMonHoc.EditValue && p.Nam_hoc == string.Format(txtNamBatDau.Text + "-" + txtNamKetThuc.Text) && p.Hoc_ky == int.Parse(txtHocKy.Text)).Select(o=>o.ID_lop_hp).FirstOrDefault();
                            if (kt == 0)
                            {

                                var lophps = new LopHocPhan
                                {
                                    ID_lop = row.ID_lop,
                                    ID_mon = (int)lueMonHoc.EditValue,
                                    Hoc_ky = int.Parse(txtHocKy.Text),
                                    Nam_hoc = string.Format(txtNamBatDau.Text + "-" + txtNamKetThuc.Text)
                                };
                                db.LopHocPhans.InsertOnSubmit(lophps);
                                db.SubmitChanges();
                                foreach (var sv in dsl)
                                {
                                    var ID_lophp = db.LopHocPhans.Where(p => p.ID_lop == row.ID_lop && p.ID_mon == (int)lueMonHoc.EditValue).Select(o => o.ID_lop_hp).First();
                                    var sinhvien = new DanhSachLopHocPhan
                                    {
                                        ID_lop_hp = ID_lophp,
                                        ID_sv = sv.ID_sv
                                    };
                                    db.DanhSachLopHocPhans.InsertOnSubmit(sinhvien); 
                                    db.SubmitChanges();
                                    var sinhvien1 = new Diem
                                    {
                                        ID_sv = sv.ID_sv,
                                        ID_lop_hp = ID_lophp
                                    };
                                    db.Diems.InsertOnSubmit(sinhvien1);
                                    db.SubmitChanges();
                                }
                            }
                        }
                    }
                    MessageBox.Show("Tạo lớp học phần thành công");
                }
                catch
                {
                    MessageBox.Show("Lỗi");
                }
            }
        }

        private void btnHienThi_Click(object sender, EventArgs e)
        {
            Context db =new Context();  
            int id_hes =int.Parse(lueHe.EditValue.ToString());
            int id_khoas=int.Parse(lueKhoa.EditValue.ToString());
            int id_chuyennganhs=int.Parse(lueChuyenNganh.EditValue.ToString());
            int khoa_hocs=int.Parse(lueKhoaHoc.Text);
            var CTDT = db.ChuongTrinhDaoTaos.Where(p => p.ID_he == id_hes && p.ID_khoa == id_khoas && p.ID_chuyen_nganh == id_chuyennganhs && p.Khoa_hoc == khoa_hocs).Select(o => o.ID_dt).FirstOrDefault();
            if (CTDT == 0)
            {
                MessageBox.Show("Không có dữ liệu");
            }
            else
            {
                var lops = db.Lops.Where(p => p.ID_khoa == id_khoas && p.ID_he == id_hes && p.ID_chuyen_nganh == id_chuyennganhs && p.Khoa_hoc == khoa_hocs).First();
                int ky_thus = ConvertKyHoc(txtNamBatDau.Text, txtNamKetThuc.Text, txtHocKy.Text, lops.Nien_khoa);
                var CTDTCT = db.ChuongTrinhDaoTaoChiTiets.Where(p => p.ID_dt == CTDT && p.Ky_thu==ky_thus).ToList();
                

                if (CTDTCT.Count == 0)
                {
                    MessageBox.Show("Không có chương trình đào tạo");
                }
                else
                {
                    chuongTrinhDaoTaoChiTietBindingSource.DataSource = CTDTCT;
                    C_Mon.LoadDataSource(lueMonHoc);
                    var row = gridView1.GetFocusedRow() as ChuongTrinhDaoTaoChiTiet;

                    lueMonHoc.EditValue = row.ID_mon;
                }   
                        
                
            }
        }

        private void lueHe_EditValueChanged(object sender, EventArgs e)
        {
            if (lueKhoa.EditValue != null)
            {
                Context db = new Context();
                var ID_chuyennganhs = db.ChuongTrinhDaoTaos.Where(p => p.ID_he == (int)lueHe.EditValue && p.ID_khoa == (int)lueKhoa.EditValue).Select(o => o.ID_chuyen_nganh).Distinct().ToList();
                var chuyennganhs = new List<ChuyenNganh>();
                foreach (var row in ID_chuyennganhs)
                {
                    var chuyennganh = db.ChuyenNganhs.Where(p => p.ID_chuyen_nganh == row).First();
                    int a = 0;
                    if (int.TryParse(chuyennganh.Ma_chuyen_nganh, out a) && lueHe.Text == "Trung cấp chuyên nghiệp")
                    {
                        chuyennganhs.Add(chuyennganh);
                    }
                    else if (!int.TryParse(chuyennganh.Ma_chuyen_nganh, out a) && lueHe.Text == "Cao đẳng chính quy")
                    {
                        chuyennganhs.Add(chuyennganh);
                    }
                }
                lueChuyenNganh.Properties.Columns.Clear();

                lueChuyenNganh.Properties.DataSource = chuyennganhs.ToList();

                lueChuyenNganh.Properties.Columns.Add(new DevExpress.XtraEditors.Controls.LookUpColumnInfo("Chuyen_nganh", "Chuyên ngành"));
                lueChuyenNganh.Properties.BestFitMode = DevExpress.XtraEditors.Controls.BestFitMode.BestFit;

                lueChuyenNganh.Properties.DisplayMember = "Chuyen_nganh";
                lueChuyenNganh.Properties.ValueMember = "ID_chuyen_nganh";
                lueChuyenNganh.Properties.NullText = "";
                lueChuyenNganh.ToolTip = lueChuyenNganh.Properties.NullValuePrompt = "Chọn chuyên ngành";

                lueChuyenNganh.Properties.NullValuePromptShowForEmptyValue = true;
                lueChuyenNganh.Properties.AllowDropDownWhenReadOnly = DevExpress.Utils.DefaultBoolean.True;
                lueChuyenNganh.ItemIndex = 0;

            }
        }

        private void lueKhoa_EditValueChanged(object sender, EventArgs e)
        {
            if (lueHe.EditValue != null)
            {
                Context db = new Context();
                var ID_chuyennganhs = db.ChuongTrinhDaoTaos.Where(p => p.ID_he == (int)lueHe.EditValue && p.ID_khoa == (int)lueKhoa.EditValue).Select(o => o.ID_chuyen_nganh).Distinct().ToList();
                var chuyennganhs = new List<ChuyenNganh>();
                foreach (var row in ID_chuyennganhs)
                {
                    var chuyennganh = db.ChuyenNganhs.Where(p => p.ID_chuyen_nganh == row).First();
                    int a = 0;
                    if (int.TryParse(chuyennganh.Ma_chuyen_nganh, out a) && lueHe.Text == "Trung cấp chuyên nghiệp")
                    {
                        chuyennganhs.Add(chuyennganh);
                    }
                    else if (!int.TryParse(chuyennganh.Ma_chuyen_nganh, out a) && lueHe.Text == "Cao đẳng chính quy")
                    {
                        chuyennganhs.Add(chuyennganh);
                    }
                }
                lueChuyenNganh.Properties.Columns.Clear();

                lueChuyenNganh.Properties.DataSource = chuyennganhs.ToList();

                lueChuyenNganh.Properties.Columns.Add(new DevExpress.XtraEditors.Controls.LookUpColumnInfo("Chuyen_nganh", "Chuyên ngành"));
                lueChuyenNganh.Properties.BestFitMode = DevExpress.XtraEditors.Controls.BestFitMode.BestFit;

                lueChuyenNganh.Properties.DisplayMember = "Chuyen_nganh";
                lueChuyenNganh.Properties.ValueMember = "ID_chuyen_nganh";
                lueChuyenNganh.Properties.NullText = "";
                lueChuyenNganh.ToolTip = lueChuyenNganh.Properties.NullValuePrompt = "Chọn chuyên ngành";

                lueChuyenNganh.Properties.NullValuePromptShowForEmptyValue = true;
                lueChuyenNganh.Properties.AllowDropDownWhenReadOnly = DevExpress.Utils.DefaultBoolean.True;
                lueChuyenNganh.ItemIndex = 0;
            }
        }

        private void txtNamBatDau_EditValueChanged(object sender, EventArgs e)
        {

        }

        private void txtHocKy_EditValueChanged(object sender, EventArgs e)
        {

        }

        private void simpleButton1_Click(object sender, EventArgs e)
        {
            Close();
        }

        private void txtHocKy_Validating(object sender, CancelEventArgs e)
        {
            if (string.IsNullOrEmpty(txtHocKy.Text) || (txtHocKy.Text.Length != 1))
            {
                MessageBox.Show("Chưa nhập đúng dữ liệu năm học");
                txtHocKy.SetFocus();
            }
         
        }


    }
}